﻿Imports StartFrame.Web.BR.Helpers
Imports StartFrame.Web.BR
Imports StartFrame.BR.Web.Helpers

Namespace Mantenimiento.Administracion.Seguridad


    'Clase para la tabla wad_operadores
    Public Class Usuario
        Inherits JsonAbm

        ''' <summary>
        ''' Esta clase se encarga de la administración de los usuarios registrados en el sistema.
        ''' </summary>
        Sub New()
            'Modificar nombre de programa y tabla principal relacionada a la clase
            MyBase.New(Operador, Password, "XRUsuario", "wad_operadores", "nm_operador")
            MyBase.lnk_nombreOperador = Common.Env.Operador
        End Sub

#Region "eventos"

        'Completa valores por defecto en las altas
        Private Sub Usuario_Insertando(ByRef cancela As Boolean, ByRef row As System.Data.DataRow) Handles Me.Insertando
            row("va_clave_acceso") = SystemFunctions.Strings.EncryptString(New Configuration.AppSettingsReader().GetValue("defaultPassword", GetType(String)), KEY, SystemFunctions.Strings.Accion.ENCRYPT)
            row("cd_barra_herr") = DBNull.Value
            row("fe_alta") = DateTime.Now
        End Sub

        'Completa valores en las modificaciones
        Private Sub Usuario_Modificando(ByRef cancela As Boolean, ByRef row As System.Data.DataRow) Handles Me.Modificando
            row("cd_barra_herr") = DBNull.Value
            If row("st_cambiar_clave", DataRowVersion.Original) = False AndAlso row("st_cambiar_clave") = True Then
                row("va_clave_acceso") = SystemFunctions.Strings.EncryptString(New Configuration.AppSettingsReader().GetValue("defaultPassword", GetType(String)), KEY, SystemFunctions.Strings.Accion.ENCRYPT)
            End If
        End Sub

        'Validaciones
        Private Sub Usuario_Validando(ByRef cancela As Boolean, ByRef paramDataTable As System.Data.DataTable) Handles Me.Validando
            Dim row As DataRow
            'Recorre todos los registros de la tabla
            For Each row In paramDataTable.Rows
                If row.RowState <> DataRowState.Deleted Then
                    'Valida campo obligatorio
                    If IsDBNull(row("nm_operador")) OrElse row("nm_operador").ToString = String.Empty Then
                        row.SetColumnError("nm_operador", "El nombre del operador es obligatorio.")
                        cancela = True
                    End If
                End If
            Next
        End Sub

#End Region

#Region "metodos"

        ''' <summary>
        ''' Devuelve una lista de todos los grupos de usuarios
        ''' </summary>
    Public Function ObtenerGrupos() As String
        'Set de resultados a retornar al cliente
            Dim result As New ResultSet
        Try
            'Ejecuta la consulta y carga el resultset
            result.LoadTable(DA.Sql.Select(ConnectionString, origen:="wld_miembros_grupo").Tables(0))

        Catch ex As Exception
            'Información del error a retornar al cliente
            result.success = False
            result.message = ex.Message
        End Try

        'Retorna los datos serializados
        Return result.ToJsonString()
    End Function

        ''' <summary>
        ''' Dado un operador, retorna el grupo al cual pertenece
        ''' </summary>
        Public Function getGrupo(cd_operador As String) As String

            Dim sRdo As String
            Dim sSelect, sFrom, sWhere As String

            'Define la consulta
            sSelect = "cd_grupo_operadores"
            sFrom = "wld_miembros_grupo"
            sWhere = "cd_operador = " & StartFrame.SystemFunctions.Strings.StringToSql(cd_operador)

            'Ejecuta la consulta
            sRdo = CType(DA.Sql.Search(ConnectionString, sSelect, sFrom, sWhere), String)

            'Retorno
            Return sRdo

        End Function

        ''' <summary>
        ''' Relaciona el operador con el grupo, insertando la nueva relación y eliminando cualquier que exista previamente
        ''' </summary>
        ''' <param name="cd_operador">Operador cuyo grupo de pertenencia se desea modificar</param>
        ''' <param name="cd_grupo">Grupo al cual se asociará el operador</param>
        Public Sub setGrupo(cd_operador As String, cd_grupo As String)

            '1. Elimina cualquier relación operador-grupo anterior (sólo permite una relación 1-1)
            Dim sTabla, sCampos, sValores, sCond As String

            sTabla = "wld_miembros_grupo"
            sCond = "cd_operador = " & StartFrame.SystemFunctions.Strings.StringToSql(cd_operador)

            DA.Sql.Delete(ConnectionString, sTabla, sCond)

            '2. Inserta la nueva relación
            sCampos = "cd_operador, cd_grupo_operadores"
            sTabla = "wld_miembros_grupo"
            sValores = StartFrame.SystemFunctions.Strings.StringToSql(cd_operador)
            sValores &= ", " & StartFrame.SystemFunctions.Strings.StringToSql(cd_grupo)

            If DA.Sql.Insert(ConnectionString, sTabla, sCampos, sValores) = 0 Then
                Throw New Exception(String.Format("No se pudo insertar el registro en {0}({1}) con los sig. valores: {2}", sTabla, sCampos, sValores))
            End If

        End Sub

        'Dado un operador, retorna la entidad a la cual pertenece
        Public Function getEntidad(cd_operador As String) As String

            Dim sRdo As String
            Dim sSelect, sFrom, sWhere As String

            'Define la consulta
            sSelect = "isnull(id_entidad, '') as id_entidad"
            sFrom = "wad_operadores"
            sWhere = "cd_operador = " & StartFrame.SystemFunctions.Strings.StringToSql(cd_operador)

            'Ejecuta la consulta
            sRdo = CType(DA.Sql.Search(ConnectionString, sSelect, sFrom, sWhere), String)

            'Retorno
            Return sRdo

        End Function

        'Relaciona el operador con la entidad de su supervisor
        Public Sub setEntidad(cd_operador As String, cd_supervisor As String)
            'Busca la entidad del supervisor encargado del alta del usuario
            Dim sSelect, sFrom, sWhere As String
            Dim sCampos, sValores, sTabla As String
            Dim sEntidad As String

            sSelect = "isnull(id_entidad, '') as id_entidad"
            sFrom = "wad_operadores"
            sWhere = "cd_operador = " & StartFrame.SystemFunctions.Strings.StringToSql(cd_supervisor)

            sEntidad = CType(DA.Sql.Search(ConnectionString, sSelect, sFrom, sWhere), String)

            If sEntidad = String.Empty Then
                Throw New Exception("El supervisor no pertenece a ninguna entidad dentro del sistema.")
            End If

            'Actualiza la entidad a la cual pertenece el operador
            sCampos = "id_entidad"
            sTabla = "wad_operadores"
            sValores = StartFrame.SystemFunctions.Strings.StringToSql(sEntidad)
            sWhere = "cd_operador = " & StartFrame.SystemFunctions.Strings.StringToSql(cd_operador)

            If DA.Sql.Update(ConnectionString, sTabla, sCampos, sValores, , sWhere) = 0 Then
                Throw New Exception(String.Format("No se pudo relacionar al usuario {0} con la entidad {1} del supervisor {2}.", _
                                                  cd_operador, sEntidad, cd_supervisor))
            End If

        End Sub

#End Region
    End Class
End Namespace